#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <string.h>

#include "cola.h"
#include "parser.h"
#include "sistema_comandos.h"
#include "gestor.h"

#define MAX_LENGTH 200
#define CANT_COMANDOS 5

const char *COMANDOS[CANT_COMANDOS] = {"agregar_resultado","listar_jugadores","listar_goleador","goles_jugador","mostrar_resultado"};

enum comandos
{
	AGREGAR_RESULTADO,
	LISTAR_JUGADORES,
	LISTAR_GOLEADOR,
	GOLES_JUGADOR,
	MOSTRAR_RESULTADO
};

enum comandos obtener_comando(const char* clave)
{	
	for(size_t i = 0; i < CANT_COMANDOS; i++)
	{
		if(!strcmp(clave,COMANDOS[i])) 
			return i; 
	}	
	return -1;
}

int ejecutar_sistema(int argc, char *argv[])
{	
	gestor_t *gestor = gestor_crear();
	if(!gestor)
	{
		fprintf(stderr,"ERROR: crear_gestor devuelve NULL\n");
		return 1;
	}
	
	// Carga de datos	
	if(!gestor_cargar_datos(gestor,argc,argv))
	{
		fprintf(stderr,"ERROR: gestor_cargar_datos devuelve false\n");
		return 1;		
	}	
	
	// Verifico stdin
	if(!stdin)
	{
		gestor_destruir(gestor);
		return 0;
	}
	
	char line[MAX_LENGTH];
		
	if(!fgets(line,MAX_LENGTH,stdin))
	{
		gestor_destruir(gestor);
		// Modifico para que la prueba no devuelva error
		return 0;		
	}
	
	while(!feof(stdin))
	{	
		char *comando = malloc(sizeof(char)*MAX_LENGTH);
		if(!comando)
			break;
		
		int param_start = getCommand(&comando,line);		
		
		if(!comando)
			break;
		
		cola_t *cola_parametros = parse_parameters(&line[param_start]);
		if(!cola_parametros)
		{
			fprintf(stderr,"ERROR: cola es NULL\n");
			free(comando);
			gestor_destruir(gestor);
			return 2;
		}
		
		switch(obtener_comando(comando))
		{	
			case AGREGAR_RESULTADO:				
				agregar_resultado(gestor,cola_parametros);
				break;
			case LISTAR_JUGADORES:
				listar_jugadores(gestor,cola_parametros);
				break;
			case LISTAR_GOLEADOR:
				gestor_listar_goleador(gestor);
				break;
			case GOLES_JUGADOR:
				goles_jugador(gestor,cola_parametros);
				break;
			case MOSTRAR_RESULTADO:
				mostrar_resultado(gestor,cola_parametros);
				break;
			default:
				break;
		}
		
		cola_destruir(cola_parametros,free);								
		free(comando);				
		
		if(!fgets(line,MAX_LENGTH,stdin))
			break;
	}
	
	gestor_destruir(gestor);
	
	return 0;	
}

int main(int argc, char *argv[])
{	
	return ejecutar_sistema(argc,argv);
}









